unit Worthless;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, 
  Controls, Forms, Dialogs;

type
 TEnumProp = (epZero, epOne, epTwo, epThree);

 TSetPropOption = (poOne, poTwo, poThree,
                                  poFour, poFive);
  TSetPropOptions = set of TSetPropOption;

  TSomeObject = class(TPersistent)
        private
        FProp1: Integer;
        FProp2: String;
        public
        procedure Assign(Source: TPersistent);
        published
        property Prop1: Integer
                     read FProp1 write FProp1;
        property Prop2: String
                     read FProp2 write FProp2;
end;

  TWorthless = class(TCustomControl)
  private
FEnumProp: TEnumProp;
FBooleanProp: Boolean;
     FOptions: TSetPropOptions;
     FSomeObject: TSomeObject;

    { Private declarations }
  protected
    procedure     SetSomeObject(Value: TSomeObject);

    { Protected declarations }

  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    { Public declarations }
  published

   property EnumProp: TEnumProp 
                     read FEnumProp write FEnumProp;
   property BooleanProp: Boolean 
                     read FBooleanProp write FBooleanProp;

   property Options: TSetPropOptions
                            read FOptions write FOptions;
   property SomeObject: TSomeObject
                  read FSomeObject write SetSomeObject;

    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TWorthless]);
end;

{ TSomeObject }

procedure TSomeObject.Assign(Source: TPersistent);
begin
  if Source is TSomeObject then
  begin
    FProp1 := TSomeObject(Source).Prop1;
    FProp2 := TSomeObject(Source).Prop2;
    inherited Assign(Source);
  end;
end;

{ TWorthless }

constructor TWorthless.Create(AOwner: TComponent);
begin
  inherited;
  FSomeObject := TSomeObject.Create;
end;

destructor TWorthless.Destroy;
begin
  FSomeObject.Free;
  inherited;
end;

procedure TWorthless.SetSomeObject(
                                        Value: TSomeObject);
begin
   FSomeObject:=Value;
end;

end.
